package com.bawei.doctor.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.UploadFileRequest;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
   <dependency>
      <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
      <version>3.8.0</version>
  </dependency>
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 20MB    #修改图片大小限制
 */
public class OSSFileUtil {

    private static String endpoint = "oss-cn-shanghai.aliyuncs.com";
    private static String accessKeyId = "LTAI5tHyoKgaEWob32eC7A5L";
    private static String accessKeySecret = "2utcbdyzZkINsCOSWWXzFdLTW6EGSo";
    private static String bucketName = "1904a-lty-img";
    private static String key = "<key>";

    //url上传路径
    public static String uploadFile(MultipartFile file) throws IOException {
        //获取文件名称
        String filename = file.getOriginalFilename();
        //得到一个uuid随机的字符串
        String uuid = UUID.randomUUID().toString();
        //uuid和文件的后缀名称拼接得到一个新的文件名称
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        String objectName = uuid+filename.substring(filename.lastIndexOf("."));

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（objectName）

        ossClient.putObject(bucketName, objectName, file.getInputStream());

        // 关闭OSSClient。
        ossClient.shutdown();

        return "https://"+bucketName+"."+endpoint+"/"+objectName;

    }
    //oss下载
    public static String downFile(MultipartFile file,String  url) throws IOException {
        //获取文件路径
        String name = file.getName();
        System.out.println(name);

        return "";
    }

    //断点续传 分片上传
    //url上传路径
    public static String uploadDuanFile(MultipartFile file) throws Throwable {
// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
        meta.setContentType("text/plain");
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        //获取文件名称
        String filename = file.getOriginalFilename();
        //得到一个uuid随机的字符串
        String uuid = UUID.randomUUID().toString();
        //uuid和文件的后缀名称拼接得到一个新的文件名称
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        String objectName = uuid+filename.substring(filename.lastIndexOf("."));


        UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName,objectName);

        File file1 = multipartFileToFile(file);
        String absolutePath = file1.getAbsolutePath();
// 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
        uploadFileRequest.setUploadFile(absolutePath);
// 指定上传并发线程数，默认值为1。
        uploadFileRequest.setTaskNum(5);
// 指定上传的分片大小。
        uploadFileRequest.setPartSize(100 * 1024 );
// 开启断点续传，默认关闭。
        uploadFileRequest.setEnableCheckpoint(true);
// 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中。 使用默认值
        //uploadFileRequest.setCheckpointFile("yourCheckpointFile");
// 文件的元数据。
        uploadFileRequest.setObjectMetadata(meta);
// 设置上传成功回调，参数为Callback类型。
//uploadFileRequest.setCallback("yourCallbackEvent");

// 断点续传上传。
        ossClient.uploadFile(uploadFileRequest);
// 关闭OSSClient。
        ossClient.shutdown();

        return "https://"+bucketName+"."+endpoint+"/"+objectName;
    }

    /**
     * MultipartFile 转 File
     *
     * @param file
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }
    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
